/**
 * Clase que representa el problema de la rejilla
 * estado: 1 es rojo, 0 es azul
 *
 */

package Problemas;

import Busquedas.Estado;


public class Rejilla extends Problema{

       

       private int x1,x2, x3, x4, x5, x6, x7, x8, x9;

       int[][] matriz;

       /**
     * Constructor del problema
     */
    public Rejilla(){

               x1 = 1;
               x2 = 1;
               x3 = 1;
               x4 = 0;
               x5 = 1;
               x6 = 1;
               x7 = 0;
               x8 = 0;
               x9 = 0;
               int[] paramInicial = {x1,x2,x3,x4,x5,x6,x7,x8,x9};
               int[] paramObjetivo = {1,0,1,0,1,0,1,0,1};
               int[] paramObjetivo2 = {0,1,0,1,0,1,0,1,0};
               Estado inicial = new Estado(paramInicial);
               Estado[] objetivo = new Estado[2];
               objetivo[0] = new Estado(paramObjetivo);
               objetivo[1] = new Estado(paramObjetivo2);
               String [] nombresOperadores={"padre","Cambia1","Cambia2","Cambia3","Cambia4","Cambia5","Cambia6","Cambia7","Cambia8","Cambia9"};
               int [] costeOperadores={1,1,1,1,1,1,1,1,1};
               inicializa(inicial,objetivo,9,nombresOperadores,costeOperadores);
               matriz = new int[3][3];
       }

       /* (non-Javadoc)
     * @see Problema#funcionHeuristica(Estado)
     */
    public int funcionHeuristica(Estado e) {
  
               int valorH = 0;
               for (int i = 0; i < 3; i++){
                       for (int j = 0; j < 3; j++){
                               if ((i!=0)&&(matriz[i-1][j]==matriz[i][j])){
                                       valorH++;
                               }
                               if ((i!=2)&&(matriz[i+1][j]==matriz[i][j])){
                                       valorH++;
                               }
                               if ((j!=0)&&(matriz[i][j-1]==matriz[i][j])){
                                       valorH++;
                               }
                               if ((j!=2)&&(matriz[i][j+1]==matriz[i][j])){
                                       valorH++;
                               }
                       }
               }
               return valorH/2;
       }

       public Estado cambia1(Estado e){

               if (e.getParametro(0)==1) x1=0;
               else x1=1;
               int param[] = {x1,x2,x3,x4,x5,x6,x7,x8,x9};
               return new Estado(param);
       }


       public Estado cambia2(Estado e){
               if (e.getParametro(1)==1) x2=0;
               else x2=1;
               int param[] = {x1,x2,x3,x4,x5,x6,x7,x8,x9};
               return new Estado(param);
       }

       public Estado cambia3(Estado e){
               if (e.getParametro(2)==1) x3=0;
               else x3=1;
               int param[] = {x1,x2,x3,x4,x5,x6,x7,x8,x9};
               return new Estado(param);
       }

       public Estado cambia4(Estado e){
               if (e.getParametro(3)==1) x4=0;
               else x4=1;
               int param[] = {x1,x2,x3,x4,x5,x6,x7,x8,x9};
               return new Estado(param);
       }

       public Estado cambia5(Estado e){
               if (e.getParametro(4)==1) x5=0;
               else x5=1;
               int param[] = {x1,x2,x3,x4,x5,x6,x7,x8,x9};
               return new Estado(param);
       }

       public Estado cambia6(Estado e){
               if (e.getParametro(5)==1) x6=0;
               else x6=1;
               int param[] = {x1,x2,x3,x4,x5,x6,x7,x8,x9};
               return new Estado(param);
       }

       public Estado cambia7(Estado e){
               if (e.getParametro(6)==1) x7=0;
               else x7=1;
               int param[] = {x1,x2,x3,x4,x5,x6,x7,x8,x9};
               return new Estado(param);
       }

       public Estado cambia8(Estado e){
               if (e.getParametro(7)==1) x8=0;
               else x8=1;
               int param[] = {x1,x2,x3,x4,x5,x6,x7,x8,x9};
               return new Estado(param);
       }

       public Estado cambia9(Estado e){
               if (e.getParametro(8)==1) x9=0;
               else x9=1;
               int param[] = {x1,x2,x3,x4,x5,x6,x7,x8,x9};
               return new Estado(param);
       }

       public Estado aplicaOperador(Estado actual, int i) {
               asignaParametros(actual);
               Estado siguiente = null;
               switch(i){
               case 0:
                       siguiente = cambia1(actual);
                       break;
               case 1:
                       siguiente = cambia2(actual);
                       break;
               case 2:
                       siguiente = cambia3(actual);
                       break;
               case 3:
                       siguiente = cambia4(actual);
                       break;
               case 4:
                       siguiente = cambia5(actual);
                       break;
               case 5:
                       siguiente = cambia6(actual);
                       break;
               case 6:
                       siguiente = cambia7(actual);
                       break;
               case 7:
                       siguiente = cambia8(actual);
                       break;
               case 8:
                       siguiente = cambia9(actual);
                       break;

               }
               return siguiente;
       }

      // @Override
       public int getOperadorInverso(int op) {
               return op;
       }

    private void asignaParametros(Estado actual) {
        x1 = actual.getParametro(0);
        x2 = actual.getParametro(1);
        x3 = actual.getParametro(2);
        x4 = actual.getParametro(3);
        x5 = actual.getParametro(4);
        x6 = actual.getParametro(5);
        x7 = actual.getParametro(6);
        x8 = actual.getParametro(7);
        x9 = actual.getParametro(8);


    }
}

